<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>

	
	  <!-- base href="http://www.dosideas.com/java/214-les-presentamos-spring-batch.html" -->
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <meta name="robots" content="index, follow">
  <meta name="keywords" content="spring, spring batch, spring framework, introduccion a spring batch">
  <meta name="title" content="Les presentamos Spring Batch">
  <meta name="author" content="Diego Gomez">
  <meta name="description" content="Intentaremos hacer una introducción a Spring Batch, uno de los componentes de Spring mas desconocidos hoy en día. No será esta una guía completa del framework, aunque pretemdemos facilitar el primer contacto con este componente y nombrar algunas de sus características.">
  <meta name="generator" content="Joomla! 1.5 - Open Source Content Management">
  <title>Les presentamos Spring Batch</title>
  <script type="text/javascript" src="214-les-presentamos-spring-batch_files/mootools.js"></script>
  <script type="text/javascript" src="214-les-presentamos-spring-batch_files/caption.js"></script>

	
<link rel="shortcut icon" href="http://www.dosideas.com/images/favicon.ico">
<link rel="stylesheet" href="214-les-presentamos-spring-batch_files/general.css" type="text/css">
<link href="214-les-presentamos-spring-batch_files/template.css" rel="stylesheet" type="text/css">
<link href="214-les-presentamos-spring-batch_files/rokslidestrip.css" rel="stylesheet" type="text/css">
<link href="214-les-presentamos-spring-batch_files/light.css" rel="stylesheet" type="text/css">
<link href="214-les-presentamos-spring-batch_files/menustyle3-light.css" rel="stylesheet" type="text/css">
<link href="214-les-presentamos-spring-batch_files/rokzoom.css" rel="stylesheet" type="text/css">
<style type="text/css">
	div.wrapper { margin: 0 auto; width: 962px;padding:0;}
	/* clear fixes for pure css layout */
	    #maincol {float: left; margin-right: -250px; width: 100%;}
    #maincol-container {margin-right:250px;}
    #sidecol {float: right; width: 250px;}
    </style>	
<script type="text/javascript" src="214-les-presentamos-spring-batch_files/mootools-release-1.js"></script>
<script type="text/javascript" src="214-les-presentamos-spring-batch_files/rokslidestrip.js"></script>
<script type="text/javascript" src="214-les-presentamos-spring-batch_files/rokzoom.js"></script>
<script type="text/javascript" src="214-les-presentamos-spring-batch_files/rokfonts.js"></script>   
<script type="text/javascript">
	window.addEvent('load', function() {
		var modules = ['module','module-menu','module-color1','module-color2','module-color3','module-color4','module-style1','module-style1-color1','module-style1-color2','module-style1-color3','module-style1-color4','module-style2','module-style2-color1','module-style2-color2','module-style2-color3','module-style2-color4'];
		var header = "h3";
			    RokBuildSpans(modules, header);
        	});
</script>
	
<!--[if IE]>
<script type="text/javascript" src="/templates/rt_hivemind_j15/js/ie_suckerfish.js"></script>
<![endif]-->
	
<script type="text/javascript">
	window.addEvent('load', function() {
		RokZoom.init({
			imageDir: '/templates/rt_hivemind_j15/rokzoom/images/',
			resizeFX: {
				duration: 700,
				transition: Fx.Transitions.Cubic.easeOut,
				wait: true
			},
			opacityFX: {
				duration: 500,
				wait: false	
			}
		});
	});
</script>
	<link type="text/css" rel="stylesheet" href="214-les-presentamos-spring-batch_files/css.css"></head><body id="ff-optima" class="f-default light">
		<!-- begin wrapper -->
		<div class="wrapper">
			<!-- begin top section -->
			<div id="top">

									<div id="mod-search">
								<div class="moduletable">
					<form action="index.php" method="post">
	<div class="search">
		<input name="searchword" id="mod_search_searchword" maxlength="20" alt="Buscar" class="inputbox" size="20" value="buscar..." onblur="if(this.value=='') this.value='buscar...';" onfocus="if(this.value=='buscar...') this.value='';" type="text">	</div>
	<input name="task" value="search" type="hidden">
	<input name="option" value="com_search" type="hidden">
</form>		</div>
	
					</div>
									
			</div>
			<!-- end top section -->
			<!-- begin mainbody -->
			<div id="mainbody-top">
				<div id="mainbody-top2">
					<div id="mainbody-top3">
					</div>
				</div>
			</div>
			<div id="mainbody">
				<!-- begin header -->
				<div id="header">
					<a href="http://www.dosideas.com/" class="nounder"><img src="214-les-presentamos-spring-batch_files/blank.png" alt="" id="logo" border="0"></a>
					<div id="horiz-menu" class="splitmenu menustyle3">
						<div id="horiz-menu2">
															<ul class="menutop"><li class="item53"><a href="http://www.dosideas.com/noticias.html"><span>Noticias</span></a></li><li class="item72"><a href="http://www.dosideas.com/wiki"><span>Wiki</span></a></li><li class="item76"><a href="http://www.dosideas.com/cursos"><span>Cursos</span></a></li><li class="item55"><a href="http://www.dosideas.com/foros.html"><span>Foros</span></a></li></ul>								
						</div>
					</div>
				</div>
				<!-- end header -->
								<div id="mainbody-padding">
					<!-- begin maincolumn -->
					<div id="maincol">
					    <div id="maincol-container">
	    					    						
    						<div id="body-padding">
							    <table class="contentpaneopen">
<tbody><tr>
		<td class="contentheading" width="100%">
				<a href="http://www.dosideas.com/java/214-les-presentamos-spring-batch.html" class="contentpagetitle">
			Les presentamos Spring Batch</a>
			</td>
						<td class="buttonheading" align="right" width="100%">
		<a href="http://www.dosideas.com/java/214-les-presentamos-spring-batch.pdf" title="PDF" onclick="window.open(this.href,'win2','status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,height=480,directories=no,location=no'); return false;" rel="nofollow"><img src="214-les-presentamos-spring-batch_files/pdf_button.png" alt="PDF"></a>		</td>
		
				<td class="buttonheading" align="right" width="100%">
		<a href="http://www.dosideas.com/java/214-les-presentamos-spring-batch.html?tmpl=component&amp;print=1&amp;page=" title="Imprimir" onclick="window.open(this.href,'win2','status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,height=480,directories=no,location=no'); return false;" rel="nofollow"><img src="214-les-presentamos-spring-batch_files/printButton.png" alt="Imprimir"></a>		</td>
		
				<td class="buttonheading" align="right" width="100%">
		<a href="http://www.dosideas.com/component/mailto/?tmpl=component&amp;link=aHR0cDovL3d3dy5kb3NpZGVhcy5jb20vamF2YS8yMTQtbGVzLXByZXNlbnRhbW9zLXNwcmluZy1iYXRjaC5odG1s" title="Correo electrónico" onclick="window.open(this.href,'win2','width=400,height=300,menubar=yes,resizable=yes'); return false;"><img src="214-les-presentamos-spring-batch_files/emailButton.png" alt="Correo electrónico"></a>		</td>
					</tr>
</tbody></table>

<table class="contentpaneopen">
<tbody><tr>
	<td valign="top">
		<span class="small">
			Escrito por Diego Gomez		</span>
		&nbsp;&nbsp;
	</td>
</tr>

<tr>
	<td class="createdate" valign="top">
		Sábado 06 de Septiembre de 2008 21:31	</td>
</tr>


<tr>
<td valign="top">
<p><img style="float: left; margin-left: 10px; margin-right: 10px;" src="214-les-presentamos-spring-batch_files/SB0.jpeg" width="224" height="89">Intentaremos hacer una introducción a <a href="http://static.springframework.org/spring-batch/">Spring Batch</a>,
uno de los componentes de Spring mas desconocidos hoy en día. No será
esta una guía completa del framework, aunque pretemdemos facilitar el
primer contacto con este componente y nombrar algunas de sus <a href="http://static.springframework.org/spring-batch/features.html">características</a>.
Aunque no nos resulte el trabajo mas excitante el escribir programas
batch, siempre es necesario en los trabajos tener claro como podríamos
utilizar un framework para tal fin.</p>
<p>Ya hace unas semanas que jugamos un poco con el framework -sabrán
que fue mas Leo que yo no...- aunque les cuento que leí casi toda la
funcionalidad que ofrecía el componente y llegue a entender el ejemplo
que Leo me pasó y todo. En esas semanas pensabamos que teníamos un
proyecto 'justo' para este framework, que por razones de tiempo -y a
veces de NO esfuerzo- no pudimos implementar en producción.</p>



<p><strong>Antes de comenzar</strong><br>Les cuento que soy una de esas
personas que de los últimos diez años ha pasado casi seis haciendo
programas batch -por suerte no fueron los últimos seis, sino los
primeros- y despues de estos últimos cuatro años sin hacer batch, la
verdad que se me ponen los pelos de punta cuando me hablan de los
mismos. Programas en C, PRO*C monolíticos con miles de líneas de
código, con un montón de código que se dejo de usar y da miedo sacar,
con nada de documentación y si MILES de líneas de código (5000,
7000)... o sea, difíciles de entender, de mantener, eso que ahora me
molesta mas, antes estaba acostumbrado.</p>
<p>Cuando empecé a leer la <a href="http://static.springframework.org/spring-batch/spring-batch-docs/reference/html-single/index.html">documentación</a>,
el primer pensamiento que se me vino a la mente fue 'Ufff, estos de
Spring se pasaron de la raya con la ingeniería de la librería, o con la
sobreingeniería'.</p>
<p>Entonces con la lectura de la <a href="http://static.springframework.org/spring-batch/spring-batch-docs/reference/html-single/index.html">documentación</a>
hecha y con el ejemplo de Leo en mis narices, comencé a entender un
poco mas que los de Spring no habían pecado de sobreingeniería, y
podemos decir entonces que Spring Batch no es un framework sino un
esqueleto para desarrollar progamas Batch de una manera simple,
entendible y mantenible, y además tiene algunas implementaciones del
esqueleto muy buenas.</p>
<h2>Vamos entonces con Spring Batch en 2 palabras</h2>
<p>Afortunadamente, el modelo de objetos que tiene Spring Batch lo
explican los nombres por sí mismo. Vamos a tratar de enumerar los más
importantes y para vincularlos entre sí:</p>
<p>Un Job (Trabajo) se compone de uno o más Step's (Pasos). Un
JobInstance representa un determinado Job, parametrizado con un
conjunto de propiedades llamados JobParameters. Cada ejecución de una
JobInstance es una JobExecution. Imagine un trabajo de lectura de
entradas de una base de datos y la generación de un XML que represente
la misma y, a continuación, haciendo algo para limpiarla.</p>
<p>Por ejemplo, pensemos un Job compuesto de 2 Step's: lectura /
escritura y la limpieza. Si parametriza este Job por la fecha de los
datos generados, entonces nuestro Job del Viernes 13 es una
JobInstance. Cada vez que ejecute este ejemplo (si se produce un error,
para la instancia) es una JobExecution. Este modelo ofrece una gran
flexibilidad respecto a cómo los Job se inician y se ponen en marcha.
Naturalmente, esto nos lleva a iniciar sus trabajos con los parámetros
de empleo, que es responsabilidad del JobLauncher. Por último, diversos
objetos en el framework requieren un JobRepository para almacenar en
tiempo de ejecución información relacionada con la ejecución batch. De
hecho, el modelo de dominio de Spring Batch es mucho más elaborado pero
esto será suficiente por ahora.</p>
<h3>Writers, Readers o Transformers</h3>
<p>Spring Batch viene por defecto con diferentes tipos de Readers para
leer ficheros planos, XML o datos de base de datos. Estos Readers se
configuran con una especie de mapeo entre registros y objetos.</p>
<p>Por ejemplo, un archivo de planetas separado por comas, como el siguiente:</p>
<pre>10,Mercurio,4879,rocoso,mensajero de los dioses<br>20,Venus,12103,telurico,diosa del amor y de la belleza<br>30,Tierra,12875,telurico,madre de todos los dioses<br>40,Marte,6794,telurico,dios de la guerra<br></pre>
<p>Podría ser interpretado en objetos como:</p>
<pre class="java"><span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> <span style="color: rgb(0, 0, 0); font-weight: bold;">class</span> Planeta <span style="color: rgb(102, 204, 102);">{</span>
    <span style="color: rgb(0, 0, 0); font-weight: bold;">private</span> <span style="color: rgb(153, 51, 51);">int</span> codigo;
    <span style="color: rgb(0, 0, 0); font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: rgb(170, 170, 221); font-weight: bold;">String</span></a> nombre;
    <span style="color: rgb(0, 0, 0); font-weight: bold;">private</span> <span style="color: rgb(153, 51, 51);">long</span> diametro;
    <span style="color: rgb(0, 0, 0); font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: rgb(170, 170, 221); font-weight: bold;">String</span></a> tipo;
    <span style="color: rgb(0, 0, 0); font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: rgb(170, 170, 221); font-weight: bold;">String</span></a> significado;
    ....
<span style="color: rgb(102, 204, 102);">}</span>
&nbsp;</pre>
<p>Esos datos podrían por ejemplo ser transformados con cadenas de
transformadores en base a diferentes reglas y posteriormente
almacenados utilizando un Writer a base de datos con su correspondiente
mapeo entre los diferentes campos y las columnas de una tabla que
recoja esos datos.</p>
<h1>Un Hola Mundo con Spring Batch</h1>
Vamos entonces a realizar el clásico "Hola, Mundo" con Spring Batch. Básicamente crearemos un Job que contendrá 3 Steps: <ol>
<li>imprimir "Hola, "</li>
<li>imprimir "Mundo"</li>
<li>imprimir "!!!"</li>
</ol> En código deberemos programar dos archivos:  
<ul>
<li><strong>spring-batch-demo.xml</strong>, el contexto de Spring donde configuraremos Spring Batch, los Jobs y demás beans. </li>
<li><strong>ImprimirTasklet.java</strong>, que será la clase con la lógica para imprimir por consola un mensaje cualquiera. </li>
</ul>

<h2>Configuración básica</h2>
<p>Por cada Job, vamos a utilizar un bean de Spring separado que lo
representa. Hay también una serie de objetos comunes que vamos a
necesitar usualmente. Vamos a ir a través de estos objetos comunes:</p>

<p><strong>JobLauncher</strong></p>
<p>Los JobLaunchers son responsables de iniciar un trabajo con determinados parámetros. Existe una implementación prevista, <em>SimpleJobLauncher</em>,
que se basa en una TaskExecutor para poner en marcha los trabajos. Si
no específico TaskExecutor, se setea entonces un SyncTaskExecutor para
utilizarlo.</p>

<p><strong>JobRepository</strong></p>
<p>Un JobRepository es el encargado de almacenar información sobre la corrida de los Jobs.</p>
<p>Vamos a utilizar la implementación <em>MapJobRepositoryFactoryBean</em> que guarda la información de las ejecuciones en memoria.</p>
<p>En una implementación real, donde se quiere guardar en forma persistente esta información, se puede usar la implementación <em>JobRepositoryFactoryBean</em>
la cual utiliza una base de datos para almacenar toda la corrida.
Spring Batch utiliza un modelo de datos con tablas propias para este
fin.</p>

<p><strong>TransactionManager</strong></p>
<p>No es un bean propio de Spring Batch, pero lo utiliza el
JobRepository para manejar las transacciones. En este ejemplo, como no
accederemos a ningún medio transaccional, usaremos una implementación
"dummy" del transaction manager ya provista por Spring Batch, llamada <em>ResourcelessTransactionManager</em>.</p>

<h3>Aquí está nuestro spring-batch-demo.xml</h3>
<pre class="xml">&nbsp;
<span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;beans<span style="font-weight: bold; color: black;">&gt;</span></span></span>
  <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: rgb(0, 0, 102);">id</span>=<span style="color: rgb(255, 0, 0);">"transactionManager"</span> 
        <span style="color: rgb(0, 0, 102);">class</span>=<span style="color: rgb(255, 0, 0);">"org.springframework.batch.
               support.transaction.ResourcelessTransactionManager"</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
&nbsp;
  <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: rgb(0, 0, 102);">id</span>=<span style="color: rgb(255, 0, 0);">"jobRepository"</span> 
        <span style="color: rgb(0, 0, 102);">class</span>=<span style="color: rgb(255, 0, 0);">"org.springframework.batch.
               core.repository.support.MapJobRepositoryFactoryBean"</span><span style="font-weight: bold; color: black;">&gt;</span></span>
        <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"transactionManager"</span> <span style="color: rgb(0, 0, 102);">ref</span>=<span style="color: rgb(255, 0, 0);">"transactionManager"</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
  <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;
  <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: rgb(0, 0, 102);">id</span>=<span style="color: rgb(255, 0, 0);">"jobLauncher"</span> 
        <span style="color: rgb(0, 0, 102);">class</span>=<span style="color: rgb(255, 0, 0);">"org.springframework.batch.
               core.launch.support.SimpleJobLauncher"</span><span style="font-weight: bold; color: black;">&gt;</span></span>
      <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"jobRepository"</span> <span style="color: rgb(0, 0, 102);">ref</span>=<span style="color: rgb(255, 0, 0);">"jobRepository"</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
  <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/beans<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;</pre>

<h2>Los tasklets del Hola Mundo</h2>
<p>Un <em>Tasklet</em> es un objeto que contiene cualquier lógica que
será ejecutada como parte de un trabajo. Los Tasklets se construyen
mediante la implementación de la interfaz Tasklet. Los Tasklet son la
forma más simple en Spring Batch para ejecuar código.</p>
<p>Vamos a aplicar una tasklet que simplemente imprime un mensaje por consola:</p>
<pre class="java">&nbsp;
<span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> <span style="color: rgb(0, 0, 0); font-weight: bold;">class</span> ImprimirTasklet <span style="color: rgb(0, 0, 0); font-weight: bold;">implements</span> Tasklet <span style="color: rgb(102, 204, 102);">{</span>
    <span style="color: rgb(0, 0, 0); font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: rgb(170, 170, 221); font-weight: bold;">String</span></a> mensaje;
&nbsp;
    <span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: rgb(170, 170, 221); font-weight: bold;">String</span></a> getMensaje<span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span> <span style="color: rgb(102, 204, 102);">{</span>
        <span style="color: rgb(0, 0, 0); font-weight: bold;">return</span> mensaje;
    <span style="color: rgb(102, 204, 102);">}</span>
&nbsp;
    <span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> <span style="color: rgb(153, 51, 51);">void</span> setMensaje<span style="color: rgb(102, 204, 102);">(</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: rgb(170, 170, 221); font-weight: bold;">String</span></a> mensaje<span style="color: rgb(102, 204, 102);">)</span> <span style="color: rgb(102, 204, 102);">{</span>
        <span style="color: rgb(0, 0, 0); font-weight: bold;">this</span>.<span style="color: rgb(0, 102, 0);">mensaje</span> = mensaje;
    <span style="color: rgb(102, 204, 102);">}</span>
&nbsp;
    <span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> ExitStatus execute<span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span> <span style="color: rgb(0, 0, 0); font-weight: bold;">throws</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: rgb(170, 170, 221); font-weight: bold;">Exception</span></a> <span style="color: rgb(102, 204, 102);">{</span>
        <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;bntI=I%27m%20Feeling%20Lucky"><span style="color: rgb(170, 170, 221); font-weight: bold;">System</span></a>.<span style="color: rgb(0, 102, 0);">out</span>.<span style="color: rgb(0, 102, 0);">print</span><span style="color: rgb(102, 204, 102);">(</span>mensaje<span style="color: rgb(102, 204, 102);">)</span>;
        <span style="color: rgb(0, 0, 0); font-weight: bold;">return</span> ExitStatus.<span style="color: rgb(0, 102, 0);">FINISHED</span>;
    <span style="color: rgb(102, 204, 102);">}</span>
<span style="color: rgb(102, 204, 102);">}</span>
&nbsp;</pre>

<p>Tengan en cuenta que al ejecutar el método devuelve un ExitStatus para indicar el estado de la ejecución de la Tasklet.</p>
<p>Vamos a definir nuestro primer Job ahora en el XML de la aplicación.
Usaremos la implementación SimpleJob que ejecuta todos los pasos de
sequencialmente. Con el fin de conectar un tasklet a un Job,
necesitamos un TaskletStep.</p>
<p>Es decir, a continuación agregaremos a nuestra configuración anterior:</p>
<ul>
<li>un SimpleJob</li>
<li>tres TaskletStep, que referencian a nuestros Tasklet</li>
<li>tres Tasklet, configurados para imprimir distintos mensajes</li>
</ul>
<p> </p>

<pre class="xml">&nbsp;
<span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: rgb(0, 0, 102);">id</span>=<span style="color: rgb(255, 0, 0);">"trabajoBatch"</span> <span style="color: rgb(0, 0, 102);">class</span>=<span style="color: rgb(255, 0, 0);">"org.springframework.batch.core.job.SimpleJob"</span><span style="font-weight: bold; color: black;">&gt;</span></span>
    <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"steps"</span><span style="font-weight: bold; color: black;">&gt;</span></span>
        <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;list<span style="font-weight: bold; color: black;">&gt;</span></span></span>
            <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: rgb(0, 0, 102);">id</span>=<span style="color: rgb(255, 0, 0);">"primerPaso"</span> 
                  <span style="color: rgb(0, 0, 102);">class</span>=<span style="color: rgb(255, 0, 0);">"org.springframework.batch.core.step.tasklet.TaskletStep"</span><span style="font-weight: bold; color: black;">&gt;</span></span>
                <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"jobRepository"</span> <span style="color: rgb(0, 0, 102);">ref</span>=<span style="color: rgb(255, 0, 0);">"jobRepository"</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
                <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"tasklet"</span> <span style="color: rgb(0, 0, 102);">ref</span>=<span style="color: rgb(255, 0, 0);">"imprimirHola"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
            <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span>                
&nbsp;
            <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: rgb(0, 0, 102);">id</span>=<span style="color: rgb(255, 0, 0);">"segundoPaso"</span> 
                  <span style="color: rgb(0, 0, 102);">class</span>=<span style="color: rgb(255, 0, 0);">"org.springframework.batch.core.step.tasklet.TaskletStep"</span><span style="font-weight: bold; color: black;">&gt;</span></span>
                <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"jobRepository"</span> <span style="color: rgb(0, 0, 102);">ref</span>=<span style="color: rgb(255, 0, 0);">"jobRepository"</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
                <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"tasklet"</span> <span style="color: rgb(0, 0, 102);">ref</span>=<span style="color: rgb(255, 0, 0);">"imprimirMundo"</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
            <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span>                
&nbsp;
            <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: rgb(0, 0, 102);">id</span>=<span style="color: rgb(255, 0, 0);">"tercerPaso"</span> 
                  <span style="color: rgb(0, 0, 102);">class</span>=<span style="color: rgb(255, 0, 0);">"org.springframework.batch.core.step.tasklet.TaskletStep"</span><span style="font-weight: bold; color: black;">&gt;</span></span>
                <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"jobRepository"</span> <span style="color: rgb(0, 0, 102);">ref</span>=<span style="color: rgb(255, 0, 0);">"jobRepository"</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
                <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"tasklet"</span> <span style="color: rgb(0, 0, 102);">ref</span>=<span style="color: rgb(255, 0, 0);">"imprimirExclamacion"</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
            <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span>                
        <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/list<span style="font-weight: bold; color: black;">&gt;</span></span></span>
    <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/property<span style="font-weight: bold; color: black;">&gt;</span></span></span>
    <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"restartable"</span> <span style="color: rgb(0, 0, 102);">value</span>=<span style="color: rgb(255, 0, 0);">"true"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>     
    <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"jobRepository"</span> <span style="color: rgb(0, 0, 102);">ref</span>=<span style="color: rgb(255, 0, 0);">"jobRepository"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;
<span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: rgb(0, 0, 102);">id</span>=<span style="color: rgb(255, 0, 0);">"imprimirHola"</span> <span style="color: rgb(0, 0, 102);">class</span>=<span style="color: rgb(255, 0, 0);">"com.dosideas.springbatch.demo0.ImprimirTasklet"</span><span style="font-weight: bold; color: black;">&gt;</span></span>
    <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"mensaje"</span> <span style="color: rgb(0, 0, 102);">value</span>=<span style="color: rgb(255, 0, 0);">"Hola, "</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;
<span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: rgb(0, 0, 102);">id</span>=<span style="color: rgb(255, 0, 0);">"imprimirMundo"</span> <span style="color: rgb(0, 0, 102);">class</span>=<span style="color: rgb(255, 0, 0);">"com.dosideas.springbatch.demo0.ImprimirTasklet"</span><span style="font-weight: bold; color: black;">&gt;</span></span>
    <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"mensaje"</span> <span style="color: rgb(0, 0, 102);">value</span>=<span style="color: rgb(255, 0, 0);">"Mundo"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;
<span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;bean</span> <span style="color: rgb(0, 0, 102);">id</span>=<span style="color: rgb(255, 0, 0);">"imprimirExclamacion"</span> <span style="color: rgb(0, 0, 102);">class</span>=<span style="color: rgb(255, 0, 0);">"com.dosideas.springbatch.demo0.ImprimirTasklet"</span><span style="font-weight: bold; color: black;">&gt;</span></span>
    <span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;property</span> <span style="color: rgb(0, 0, 102);">name</span>=<span style="color: rgb(255, 0, 0);">"mensaje"</span> <span style="color: rgb(0, 0, 102);">value</span>=<span style="color: rgb(255, 0, 0);">"!!!"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span>
<span style="color: rgb(0, 153, 0);"><span style="font-weight: bold; color: black;">&lt;/bean<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;</pre>

<h2>Ejecutando el Job</h2>
<p>Ahora tenemos algo para poner en marcha la ejecución de nuestros
Trabajos. Para esto crearemos un test JUnit que obtenga una instancia
del JobLauncher, e inicie una corrida del Job.</p>
<pre class="java5">&nbsp;
@RunWith<span style="color: rgb(102, 204, 102);">(</span>SpringJUnit4ClassRunner.<span style="color: rgb(0, 0, 0); font-weight: bold;">class</span><span style="color: rgb(102, 204, 102);">)</span>
@ContextConfiguration<span style="color: rgb(102, 204, 102);">(</span>locations = <span style="color: rgb(102, 204, 102);">{</span>
    <span style="color: rgb(255, 0, 0);">"classpath:/com/dosideas/springbatch/demo0/spring-batch-demo.xml"</span>
<span style="color: rgb(102, 204, 102);">}</span><span style="color: rgb(102, 204, 102);">)</span>
<span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> <span style="color: rgb(0, 0, 0); font-weight: bold;">class</span> ImprimirHolaMundoTest <span style="color: rgb(102, 204, 102);">{</span>
&nbsp;
    @Autowired
    <span style="color: rgb(0, 0, 0); font-weight: bold;">private</span> SimpleJobLauncher launcher;
&nbsp;
    @Autowired
    <span style="color: rgb(0, 0, 0); font-weight: bold;">private</span> SimpleJob job;
&nbsp;
    @Test
    <span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> <span style="color: rgb(153, 51, 51);">void</span> iniciarJob<span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span> <span style="color: rgb(0, 0, 0); font-weight: bold;">throws</span> <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Exception.html"><span style="color: rgb(170, 170, 221); font-weight: bold;">Exception</span></a> <span style="color: rgb(102, 204, 102);">{</span>
        JobParametersBuilder builder = <span style="color: rgb(0, 0, 0); font-weight: bold;">new</span> JobParametersBuilder<span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span>;
        builder.<span style="color: rgb(0, 102, 0);">addDate</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">"Ejecucion"</span>, <span style="color: rgb(0, 0, 0); font-weight: bold;">new</span> <a href="http://www.google.com/search?sitesearch=java.sun.com&amp;q=allinurl%3Aj2se%2F1+5+0%2Fdocs%2Fapi+Date"><span style="color: rgb(170, 170, 221); font-weight: bold;">Date</span></a><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span><span style="color: rgb(102, 204, 102);">)</span>;
        builder.<span style="color: rgb(0, 102, 0);">addString</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(255, 0, 0);">"jobName"</span>, <span style="color: rgb(255, 0, 0);">"Imprimir hola mundo por consola"</span><span style="color: rgb(102, 204, 102);">)</span>;
        JobParameters parameters = builder.<span style="color: rgb(0, 102, 0);">toJobParameters</span><span style="color: rgb(102, 204, 102);">(</span><span style="color: rgb(102, 204, 102);">)</span>;
&nbsp;
        launcher.<span style="color: rgb(0, 102, 0);">run</span><span style="color: rgb(102, 204, 102);">(</span>job, parameters<span style="color: rgb(102, 204, 102);">)</span>;
    <span style="color: rgb(102, 204, 102);">}</span>
<span style="color: rgb(102, 204, 102);">}</span>
&nbsp;</pre>
<p>Y listo! Este test ejecutará la tarea, y veremos por consola el mensaje "Hola, Mundo!!!".</p>
<p>Spring Batch también ofrece una clase conveniente para ejecutarse desde la línea de comandos: <em>CommandLineJobRunner</em>.
En su forma más simple esta clase tiene de 2 argumentos: el XML de
contexto de la aplicación que contiene el Job para poner en marcha y el
id de ese Job. Naturalmente, requiere un JobLauncher que es configurado
en el mismo XML.</p>
<p>A continuación se muestra cómo iniciar el trabajo desde la linea de comandos  (necesita especificar el classpath):</p>
<pre>java org.springframework.batch.core.launch.support.CommandLineJobRunner
     spring-batch-demo.xml trabajoBatch
</pre>

<h2>Curso de Spring Batch y descarga de un proyecto de ejemplo</h2>
<p>Para ver más detalles pueden <a href="http://www.dosideas.com/descargas/doc_download/9-demo-de-spring-batch.html">descargar el proyecto de ejemplo de Spring Batch</a>.
Esta descarga contiene el ejemplo aquí comentado en forma completa,
junto a varios ejemplos más que demuestran distintos aspectos de Spring
Batch, y todas las librerias necesarias para su funcionamiento.</p>
<p>
Además, publicamos el <a href="http://cursos.dosideas.com/course/view.php?id=7">curso Procesamiento con Spring Batch</a>, donde repasamos las distintas características de este framework y explicamos el proyecto de ejemplo en detalle.
</p>

<p><small>Adaptado libremente de <a href="http://springtips.blogspot.com/2008/06/spring-batch-hello-world.html">Spring Batch Hello World</a>.</small></p><!-- START of joscomment -->
<script type="text/javascript">
 var _JOOMLACOMMENT_MSG_DELETE 	= "&iquest;Est&aacute;s seguro de que quieres eliminar el comentario?"; var _JOOMLACOMMENT_MSG_DELETEALL = "&iquest;Est&aacute;s seguro de que quieres eliminar todos los comentarios?"; var _JOOMLACOMMENT_WRITECOMMENT 	= "Escribir comentario"; var _JOOMLACOMMENT_SENDFORM 		= "Enviar"; var _JOOMLACOMMENT_EDITCOMMENT 	= "Editar comentario"; var _JOOMLACOMMENT_EDIT 			= "Editar"; var _JOOMLACOMMENT_FORMVALIDATE 	= "Por favor, escribe al menos un comentario."; var _JOOMLACOMMENT_FORMVALIDATE_CAPTCHA = "Por favor introduce el c&oacute;digo anti-spam que puedes leer en la imagen."; var _JOOMLACOMMENT_FORMVALIDATE_CAPTCHA_FAILED = "C&oacute;digo anti-spam incorrecto. Por favor introduce el c&oacute;digo que puedes leer en la imagen."; var _JOOMLACOMMENT_FORMVALIDATE_EMAIL = "Para ser notificado, por favor ingresa tu email"; var _JOOMLACOMMENT_ANONYMOUS 	= "An&oacute;nimo"; var _JOOMLACOMMENT_BEFORE_APPROVAL = "Tu comentario se ha enviado para que los administradores del sitio lo revisen y ser&aacute; publicado cuando lo aprueben."; var _JOOMLACOMMENT_REQUEST_ERROR = "Request failed"; var _JOOMLACOMMENT_MSG_NEEDREFRESH = "";
</script>

<script type="text/javascript" src="214-les-presentamos-spring-batch_files/client.js"></script>
<div id="comment">
<a name="JOSC_TOP"></a>

<table class="sectiontableheader" id="CommentMenu" align="center" border="0" cellpadding="0" cellspacing="0" width="100%">
  <tbody><tr>
    <td class="label" align="left">Comentarios</td>
	<td class="buttons" align="right">
	  <table border="0" cellpadding="0" cellspacing="0">
	    <tbody><tr>
		
		<td class="button"><a id="_JOOMLACOMMENT_ADDNEW" href='javascript:JOSC_afterAjaxResponse("show");JOSC_addNew()'>Añadir nuevo</a></td>
		
		
		
		<td class="button"><a id="_JOOMLACOMMENT_SEARCH" href="javascript:JOSC_searchForm()">Buscar</a></td>
		
		
	    </tr>
	  </tbody></table>
	</td>
  </tr>
</tbody></table>


<div id="JOSC_formpos">

<form name="joomlacommentform" method="post" action="index.php">
  <a name="CommentForm"></a>
  <input name="content_id" value="214" type="hidden"><input name="component" value="" type="hidden"><input name="joscsectionid" value="1" type="hidden">
  <table class="form" align="center" cellpadding="0" cellspacing="0">
    <tbody><tr>
      <td colspan="2">
      	<div class="sectiontableheader">
        	<table cellpadding="0" cellspacing="0"><tbody><tr>
        		<td align="left"><a href="javascript:JOSC_toogle('JOSCSHstretcherFORM');"><img src="214-les-presentamos-spring-batch_files/new.png" alt="+/-"></a></td>
        		<td align="left">
        			<div id="CommentFormTitle" align="center">Escribir comentario</div>
        		</td>        		
        	</tr></tbody></table>
        </div>
      </td>
    </tr>
    <tr><td>    
   <table style="visibility: hidden; display: none;" id="JOSCSHstretcherFORM" align="center" cellpadding="0" cellspacing="0" width="100%">    
    <tbody><tr class="sectiontableentry1">
      <td><div class="item">Nombre:</div></td>
      <td><div class="item">
          <input name="tname" class="inputbox" size="40" value="" type="text">
        </div></td>
    </tr>
    
    <tr class="sectiontableentry1">
      <td><div class="item">Email:</div></td>
      <td><div class="item">
          <input name="temail" class="inputbox" size="30" value="" type="text">
          &nbsp;<select name="tnotify" class="inputbox"><option value="0" selected="selected">No notificar:</option><option value="1">Notificar:</option></select>
        </div></td>
    </tr>
    
    
    <tr class="sectiontableentry1">
      <td><div class="item">Título:</div></td>
      <td><div class="item">
          <input name="ttitle" class="inputbox" size="40" type="text">
        </div></td>
    </tr>
    
    <tr id="CommentToolbar" class="sectiontableentry2">
      <td><div class="item">Código UBB:</div></td>
      <td><div class="buttoncontainer">
          <div style="float: left;"> <a href='javascript:JOSC_insertUBBTag("b")'><img src="214-les-presentamos-spring-batch_files/ubb_bold.gif" class="buttonBB" name="bb" alt="[b]"></a>&nbsp;<a href='javascript:JOSC_insertUBBTag("i")'><img src="214-les-presentamos-spring-batch_files/ubb_italicize.gif" class="buttonBB" name="bi" alt="[i]"></a>&nbsp;<a href='javascript:JOSC_insertUBBTag("u")'><img src="214-les-presentamos-spring-batch_files/ubb_underline.gif" class="buttonBB" name="bu" alt="[u]"></a>&nbsp;<a href='javascript:JOSC_insertUBBTag("url")'><img src="214-les-presentamos-spring-batch_files/ubb_url.gif" class="buttonBB" name="burl" alt="[url]"></a>&nbsp;<a href='javascript:JOSC_insertUBBTag("quote")'><img src="214-les-presentamos-spring-batch_files/ubb_quote.gif" class="buttonBB" name="bquote" alt="[quote]"></a>&nbsp;<a href='javascript:JOSC_insertUBBTag("code")'><img src="214-les-presentamos-spring-batch_files/ubb_code.gif" class="buttonBB" name="bcode" alt="[code]"></a>&nbsp;<a href='javascript:JOSC_insertUBBTag("img")'><img src="214-les-presentamos-spring-batch_files/ubb_image.gif" class="buttonBB" name="bimg" alt="[img]"></a>&nbsp; </div>
          <div style="float: left;"> <select name="menuColor" class="select" onchange="JOSC_fontColor()"><option>-color-</option><option>agua</option><option>negro</option><option>azul</option><option>fucsia</option><option>gris</option><option>verde</option><option>lima</option><option>marrón</option><option>marino</option><option>oliva</option><option>púrpura</option><option>rojo</option><option>plata</option><option>turquesa</option><option>blanco</option><option>amarillo</option></select>&nbsp;<select name="menuSize" class="select" onchange="JOSC_fontSize()"><option>-tamaño-</option><option>minúsculo</option><option>pequeño</option><option>mediano</option><option>grande</option><option>enorme</option></select> </div>
        </div></td>
    </tr>
    
    
    <tr class="sectiontableentry1">
      <td>&nbsp;</td>
      <td valign="middle"><div><div class="emoticoncontainer"><div class="emoticonseparator"></div><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":angry:")'><img src="214-les-presentamos-spring-batch_files/angry.png" alt=":angry:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":0")'><img src="214-les-presentamos-spring-batch_files/blink.png" alt=":0" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":confused:")'><img src="214-les-presentamos-spring-batch_files/blush.png" alt=":confused:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":cheer:")'><img src="214-les-presentamos-spring-batch_files/cheerful.png" alt=":cheer:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon("B)")'><img src="214-les-presentamos-spring-batch_files/cool.png" alt="B)" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":evil:")'><img src="214-les-presentamos-spring-batch_files/devil.png" alt=":evil:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":silly:")'><img src="214-les-presentamos-spring-batch_files/silly.png" alt=":silly:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":dry:")'><img src="214-les-presentamos-spring-batch_files/ermm.png" alt=":dry:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":lol:")'><img src="214-les-presentamos-spring-batch_files/grin.png" alt=":lol:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":kiss:")'><img src="214-les-presentamos-spring-batch_files/kissing.png" alt=":kiss:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":D")'><img src="214-les-presentamos-spring-batch_files/laughing.png" alt=":D" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":pinch:")'><img src="214-les-presentamos-spring-batch_files/pinch.png" alt=":pinch:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":(")'><img src="214-les-presentamos-spring-batch_files/sad.png" alt=":(" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":shock:")'><img src="214-les-presentamos-spring-batch_files/shocked.png" alt=":shock:" border="0"></a></span></span><div class="emoticonseparator"></div><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":X")'><img src="214-les-presentamos-spring-batch_files/sick.png" alt=":X" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":side:")'><img src="214-les-presentamos-spring-batch_files/sideways.png" alt=":side:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":)")'><img src="214-les-presentamos-spring-batch_files/smile.png" alt=":)" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":P")'><img src="214-les-presentamos-spring-batch_files/tongue.png" alt=":P" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":unsure:")'><img src="214-les-presentamos-spring-batch_files/unsure.png" alt=":unsure:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":woohoo:")'><img src="214-les-presentamos-spring-batch_files/w00t.png" alt=":woohoo:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":huh:")'><img src="214-les-presentamos-spring-batch_files/wassat.png" alt=":huh:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":whistle:")'><img src="214-les-presentamos-spring-batch_files/whistling.png" alt=":whistle:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(";)")'><img src="214-les-presentamos-spring-batch_files/wink.png" alt=";)" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":s")'><img src="214-les-presentamos-spring-batch_files/dizzy.png" alt=":s" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":!:")'><img src="214-les-presentamos-spring-batch_files/icon_exclaim.gif" alt=":!:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":?:")'><img src="214-les-presentamos-spring-batch_files/icon_question.gif" alt=":?:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":idea:")'><img src="214-les-presentamos-spring-batch_files/icon_idea.gif" alt=":idea:" border="0"></a></span></span><span class="emoticonseparator"><span class="emoticon"><a href='javascript:JOSC_emoticon(":arrow:")'><img src="214-les-presentamos-spring-batch_files/icon_arrow.gif" alt=":arrow:" border="0"></a></span></span><div class="emoticonseparator"></div></div></div></td>
    </tr>
    
    <tr class="sectiontableentry1">
      <td>&nbsp;</td>
      <td><div class="item">
          <textarea name="tcomment" class="inputbox" cols="40" rows="10"></textarea>
        </div></td>
    </tr>
    <tr>
      <td class="sectiontableentry2">
	  <table class="buttoncontainer" cellpadding="0" cellspacing="0">
        <tbody><tr>
          <td><input class="button" name="bsend" value="Enviar" onclick="JOSC_editPost(-1,-1)" type="button"></td>
          <td id="JOSC_busy"></td>
        </tr>
      </tbody></table>
      </td>
      <td class="sectiontableentry2">
      
      </td>
    </tr>
    
  </tbody></table>
  </td></tr>
  </tbody></table>
<script type="text/javascript">
	function JOSC_afterAjaxResponse(action) {
		switch(action) {
			case 'show':
			case 'response_reply':
			case 'response_edit':
			case 'response_quote':
				JOSC_ShowHide('','JOSCSHstretcherFORM',''); /* open */
				return 0;
				break;
			
			case 'hide':
			case 'response_editpost':
			case 'response_posted':
			case 'response_approval':
		    	JOSC_ShowHide('','',"JOSCSHstretcherFORM"); /* hide */
				return 0;
				break;
			default:
				return 0;
		}
	}
	if (window.document.URL.indexOf("#CommentForm")<0)
    	JOSC_afterAjaxResponse("hide");
</script>    
</form>

</div>

<table id="CommentPageNav" align="center" border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody><tr><td>
<div id="joscPageNav"></div>
</td><td id="JOSC_busypage"></td></tr>
</tbody></table>

<div id="Comments">
<table class="postcontainer" id="post222" style="margin-left: 0px;" cellpadding="0" cellspacing="0" width="100%"><!-- style='padding-left:0px;'> -->
	<tbody><tr>
		<td><a name="josc222"></a>
<table class="post" cellpadding="0" cellspacing="0" width="100%">
  <tbody class="sectiontableentry1">
    <tr>
      <td><table class="postheader" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            <td align="left">
            	<span class="postusername">Ramiro</span>
            	
            </td>
            <td align="right">
				
				<span class="postnotify0" title="No notificar si existe nuevo post">&nbsp;</span>
            	|<span class="postusertype">200.80.203.xxx</span>
            	|<span class="createdate">2008-09-08 06:14:28</span>
            </td>
          </tr>
        </tbody></table></td>
    </tr>
    <tr>
      <td colspan="2"><table class="postbody" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            
			<td style="overflow: hidden;">Me
parece que en este contexto, el ejemplo hola mundo no es ilustrativo de
como podemos usar y beneficiar de este framework. No se, no me termina
de cerrar.<br>
<br>
Saludos.</td>
          </tr>
        </tbody></table></td>
    </tr>
  
  <tr>
    <td><table class="postfooter" cellpadding="0" cellspacing="0" width="100%">
        <tbody><tr>
          <td align="left"><a href="javascript:JOSC_reply(222)">Responder</a> | <a href="javascript:JOSC_quote(222)">Citar</a></td>
          <td align="right"></td>
        </tr>
      </tbody></table></td>
  </tr>
  
  </tbody>
</table>
		</td>
	</tr>
</tbody></table>

<table class="postcontainer" id="post223" style="margin-left: 20px;" cellpadding="0" cellspacing="0" width="100%"><!-- style='padding-left:20px;'> -->
	<tbody><tr>
		<td><a name="josc223"></a>
<table class="post" cellpadding="0" cellspacing="0" width="100%">
  <tbody class="sectiontableentry2">
    <tr>
      <td><table class="postheader" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            <td align="left">
            	<span class="postusername"><a href="http://www.dosideas.com/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=64">leito</a></span>
            	
            </td>
            <td align="right">
				
				<span class="postnotify0" title="No notificar si existe nuevo post">&nbsp;</span>
            	|<span class="postusertype">Publisher</span>
            	|<span class="createdate">2008-09-09 05:49:44</span>
            </td>
          </tr>
        </tbody></table></td>
    </tr>
    <tr>
      <td colspan="2"><table class="postbody" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            <td class="avatarcontainer" align="center" width="1"><a href="http://www.dosideas.com/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=64"><img class="avatar" src="214-les-presentamos-spring-batch_files/Pirata.png" alt="avatar"></a></td>
			<td style="overflow: hidden;">En
el proyecto para descargar hay ejemplos más concretos con uso de
archivos y bases de datos. Proximamente vamos a explicar más en detalle
estos ejemplos. <br>
<br>
En todo caso, volviendo al "Hola Mundo", se podría modificar cada uno
de los 3 pasos para que hagan cosas diferentes. Por ejemplo, el primer
paso podría leer un archivo y subirlo a una tabla, el segundo paso
podría transformar estos datos de la tabla, y el último paso podría
ordenar estos datos con un query y guardarlos en un archivo de texto
nuevamente.</td>
          </tr>
        </tbody></table></td>
    </tr>
  
  <tr>
    <td><table class="postfooter" cellpadding="0" cellspacing="0" width="100%">
        <tbody><tr>
          <td align="left"><a href="javascript:JOSC_reply(223)">Responder</a> | <a href="javascript:JOSC_quote(223)">Citar</a></td>
          <td align="right"></td>
        </tr>
      </tbody></table></td>
  </tr>
  
  </tbody>
</table>
		</td>
	</tr>
</tbody></table>

<table class="postcontainer" id="post239" style="margin-left: 0px;" cellpadding="0" cellspacing="0" width="100%"><!-- style='padding-left:0px;'> -->
	<tbody><tr>
		<td><a name="josc239"></a>
<table class="post" cellpadding="0" cellspacing="0" width="100%">
  <tbody class="sectiontableentry1">
    <tr>
      <td><table class="postheader" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            <td align="left">
            	<span class="postusername">arturo</span>
            	&nbsp;-&nbsp;<span class="posttitle">corre con main</span>
            </td>
            <td align="right">
				
				<span class="postnotify1" title="Notificar si existe nuevo post">&nbsp;</span>
            	|<span class="postusertype">207.248.137.xxx</span>
            	|<span class="createdate">2008-09-18 07:00:21</span>
            </td>
          </tr>
        </tbody></table></td>
    </tr>
    <tr>
      <td colspan="2"><table class="postbody" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            
			<td style="overflow: hidden;">Hola
yo ya realice una serie de pasos que escriber un narchivo y lee una
base de datos. Lo que no puedo hacer es correr mi job desde un metodo
main!! que es lo que estoy haciendo mal??</td>
          </tr>
        </tbody></table></td>
    </tr>
  
  <tr>
    <td><table class="postfooter" cellpadding="0" cellspacing="0" width="100%">
        <tbody><tr>
          <td align="left"><a href="javascript:JOSC_reply(239)">Responder</a> | <a href="javascript:JOSC_quote(239)">Citar</a></td>
          <td align="right"></td>
        </tr>
      </tbody></table></td>
  </tr>
  
  </tbody>
</table>
		</td>
	</tr>
</tbody></table>

<table class="postcontainer" id="post240" style="margin-left: 20px;" cellpadding="0" cellspacing="0" width="100%"><!-- style='padding-left:20px;'> -->
	<tbody><tr>
		<td><a name="josc240"></a>
<table class="post" cellpadding="0" cellspacing="0" width="100%">
  <tbody class="sectiontableentry2">
    <tr>
      <td><table class="postheader" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            <td align="left">
            	<span class="postusername"><a href="http://www.dosideas.com/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=64">leito</a></span>
            	
            </td>
            <td align="right">
				
				<span class="postnotify0" title="No notificar si existe nuevo post">&nbsp;</span>
            	|<span class="postusertype">Publisher</span>
            	|<span class="createdate">2008-09-18 11:42:40</span>
            </td>
          </tr>
        </tbody></table></td>
    </tr>
    <tr>
      <td colspan="2"><table class="postbody" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            <td class="avatarcontainer" align="center" width="1"><a href="http://www.dosideas.com/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=64"><img class="avatar" src="214-les-presentamos-spring-batch_files/Pirata.png" alt="avatar"></a></td>
			<td style="overflow: hidden;">Fijate
que en el proyecto de demo para descargar, en el paquete "demo4" hay
justamente un ejemplo de lectura de una base de datos y escritura en un
archivo. <br>
<br>
Recordá que si estás ejecutando desde un "main" tenés que iniciar el
factory de Spring de manera adecuada (en el ejemplo de descarga, el
factory se inicia desde el mismo test JUnit).</td>
          </tr>
        </tbody></table></td>
    </tr>
  
  <tr>
    <td><table class="postfooter" cellpadding="0" cellspacing="0" width="100%">
        <tbody><tr>
          <td align="left"><a href="javascript:JOSC_reply(240)">Responder</a> | <a href="javascript:JOSC_quote(240)">Citar</a></td>
          <td align="right"></td>
        </tr>
      </tbody></table></td>
  </tr>
  
  </tbody>
</table>
		</td>
	</tr>
</tbody></table>

<table class="postcontainer" id="post248" style="margin-left: 0px;" cellpadding="0" cellspacing="0" width="100%"><!-- style='padding-left:0px;'> -->
	<tbody><tr>
		<td><a name="josc248"></a>
<table class="post" cellpadding="0" cellspacing="0" width="100%">
  <tbody class="sectiontableentry1">
    <tr>
      <td><table class="postheader" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            <td align="left">
            	<span class="postusername">Maximiliano</span>
            	&nbsp;-&nbsp;<span class="posttitle">No puedo correr el test</span>
            </td>
            <td align="right">
				
				<span class="postnotify1" title="Notificar si existe nuevo post">&nbsp;</span>
            	|<span class="postusertype">200.80.128.xxx</span>
            	|<span class="createdate">2008-09-23 07:05:47</span>
            </td>
          </tr>
        </tbody></table></td>
    </tr>
    <tr>
      <td colspan="2"><table class="postbody" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            
			<td style="overflow: hidden;">Hola, corriendo el test de helloworld obtengo un:<br>
org.springframework.beans.factory.BeanCreation Exception: Error
creating bean with name 'jobRepository' defined in class path resource
[spring-batch-demo.xml]: Error setting property values; nested
exception is org.springframework.beans.NotWritablePropertyExcep tion:
Invalid property 'transactionManager' of bean class
[org.springframework.batch.core.repository.support
.MapJobRepositoryFactoryBean]: Bean property 'transactionManager' is
not writable or has an invalid setter method. Does the parameter type
of the setter match the return type of the getter?<br>
<br>
¿sabés que puede estar mal en el context?<br>
<br>
gracias.</td>
          </tr>
        </tbody></table></td>
    </tr>
  
  <tr>
    <td><table class="postfooter" cellpadding="0" cellspacing="0" width="100%">
        <tbody><tr>
          <td align="left"><a href="javascript:JOSC_reply(248)">Responder</a> | <a href="javascript:JOSC_quote(248)">Citar</a></td>
          <td align="right"></td>
        </tr>
      </tbody></table></td>
  </tr>
  
  </tbody>
</table>
		</td>
	</tr>
</tbody></table>

<table class="postcontainer" id="post249" style="margin-left: 20px;" cellpadding="0" cellspacing="0" width="100%"><!-- style='padding-left:20px;'> -->
	<tbody><tr>
		<td><a name="josc249"></a>
<table class="post" cellpadding="0" cellspacing="0" width="100%">
  <tbody class="sectiontableentry2">
    <tr>
      <td><table class="postheader" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            <td align="left">
            	<span class="postusername">Maximiliano</span>
            	&nbsp;-&nbsp;<span class="posttitle">No puedo correr el test</span>
            </td>
            <td align="right">
				
				<span class="postnotify1" title="Notificar si existe nuevo post">&nbsp;</span>
            	|<span class="postusertype">200.80.128.xxx</span>
            	|<span class="createdate">2008-09-23 08:07:27</span>
            </td>
          </tr>
        </tbody></table></td>
    </tr>
    <tr>
      <td colspan="2"><table class="postbody" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            
			<td style="overflow: hidden;">Retiro
lo dicho !, si puedo correr el test, setaba usando la versión 2 de
spring batch que al parecer (no vie el source)
MapJobRepositoryFactoryBean no tiene el setter para que spring pueda
inyectar.<br>
<br>
La pregunta ahora es, ¿cómo uso el ejemplo del hello world desde mis
clases, desde un mail por ejemplo. ¿es mucho pedir un mini ejemplo?<br>
<br>
Gracias !</td>
          </tr>
        </tbody></table></td>
    </tr>
  
  <tr>
    <td><table class="postfooter" cellpadding="0" cellspacing="0" width="100%">
        <tbody><tr>
          <td align="left"><a href="javascript:JOSC_reply(249)">Responder</a> | <a href="javascript:JOSC_quote(249)">Citar</a></td>
          <td align="right"></td>
        </tr>
      </tbody></table></td>
  </tr>
  
  </tbody>
</table>
		</td>
	</tr>
</tbody></table>

<table class="postcontainer" id="post250" style="margin-left: 40px;" cellpadding="0" cellspacing="0" width="100%"><!-- style='padding-left:40px;'> -->
	<tbody><tr>
		<td><a name="josc250"></a>
<table class="post" cellpadding="0" cellspacing="0" width="100%">
  <tbody class="sectiontableentry1">
    <tr>
      <td><table class="postheader" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            <td align="left">
            	<span class="postusername"><a href="http://www.dosideas.com/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=64">leito</a></span>
            	
            </td>
            <td align="right">
				
				<span class="postnotify0" title="No notificar si existe nuevo post">&nbsp;</span>
            	|<span class="postusertype">Publisher</span>
            	|<span class="createdate">2008-09-23 18:12:31</span>
            </td>
          </tr>
        </tbody></table></td>
    </tr>
    <tr>
      <td colspan="2"><table class="postbody" cellpadding="0" cellspacing="0" width="100%">
          <tbody><tr>
            <td class="avatarcontainer" align="center" width="1"><a href="http://www.dosideas.com/index.php?option=com_comprofiler&amp;task=userProfile&amp;user=64"><img class="avatar" src="214-les-presentamos-spring-batch_files/Pirata.png" alt="avatar"></a></td>
			<td style="overflow: hidden;">Si tu pregunta es cómo iniciar el Job del&nbsp;"hola mundo" desde una clase de tu&nbsp;aplicación, es bastante simple. <br>
<br>
En la clase de&nbsp;tu aplicación tenés que inyectar
un&nbsp;SimpleJobLauncher, y después ejecutar las mismas&nbsp;líneas
que en el ejemplo de esta nota. Es decir,&nbsp;el código para ejecutar
el Job es el mismo desde&nbsp;un test o desde tu aplicación
(siempre&nbsp;considerando que tu aplicación use Spring, sino&nbsp;vas
a tener que levantar Spring dentro de tu&nbsp;aplicación). <br>
<br>
Si tenés más dudas te invito a&nbsp;seguirlo en el <a target="_blank" rel="external nofollow" href="http://www.dosideas.com/foros.html?func=showcat&amp;catid=2" title="Visit http://www.dosideas.com/foros.html?func=showcat&amp;catid=2">foro de Java</a>, que va a ser más claro.</td>
          </tr>
        </tbody></table></td>
    </tr>
  
  <tr>
    <td><table class="postfooter" cellpadding="0" cellspacing="0" width="100%">
        <tbody><tr>
          <td align="left"><a href="javascript:JOSC_reply(250)">Responder</a> | <a href="javascript:JOSC_quote(250)">Citar</a></td>
          <td align="right"></td>
        </tr>
      </tbody></table></td>
  </tr>
  
  </tbody>
</table>
		</td>
	</tr>
</tbody></table>

<script type="text/javascript"> var JOSC_postCSS=2;</script></div>

<div id="poweredby" class="small" align="center">Powered by <a target="_blank" href="http://compojoom.com/">!JoomlaComment 3.26</a></div>
<h4 style="display: none;">3.26 Copyright (C) 2008 Compojoom.com /
Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek
Hliva. All rights reserved."</h4></div>
<script type="text/javascript">
var JOSC_ajaxEnabled=1;if (!JOSC_http) JOSC_ajaxEnabled=false;var JOSC_sortDownward='0';var JOSC_captchaEnabled=false;var JOSC_template='http://www.dosideas.com/media/myjosctemplates/mySSlide-emotop';var JOSC_liveSite='http://www.dosideas.com/components/com_comment/joscomment';var JOSC_ConfigLiveSite='http://www.dosideas.com';var JOSC_linkToContent='http://www.dosideas.com/java/214-les-presentamos-spring-batch.html';var JOSC_autopublish='1';
</script>

<script type="text/javascript"><!--
 if (!JOSC_cssStyleSheet)
 { var JOSC_csslink = document.createElement('link');
 var JOSC_cssStyleSheet = 'http://www.dosideas.com/media/myjosctemplates/mySSlide-emotop/css/css.css';
 JOSC_csslink.setAttribute('href', JOSC_cssStyleSheet );
 JOSC_csslink.setAttribute('rel', 'stylesheet');
 JOSC_csslink.setAttribute('type', 'text/css');
 var JOSC_csshead = document.getElementsByTagName('head').item(0);
 JOSC_csshead.appendChild(JOSC_csslink);
 }//-->
</script><!-- END of joscomment --></td>
</tr>

</tbody></table>
<span class="article_separator">&nbsp;</span>

							</div>
    						    						    					</div>
					</div>
					<!-- end maincolumn -->
					<!-- begin sidecolumn -->
											<div id="sidecol">
							<div id="sidecol-padding">
																		<div class="module-style2-color3">
			<div>
				<div>
					<div>
													<h3 style="visibility: visible;"><span>Más</span> reflexiones</h3>
											<ul class="menu"><li class="item65"><a href="http://www.dosideas.com/coaching.html"><span>Coaching</span></a></li><li class="item66"><a href="http://www.dosideas.com/liderazgo.html"><span>Liderazgo</span></a></li><li class="item77"><a href="http://www.dosideas.com/metodologias.html"><span>Metodologías</span></a></li><li class="item67"><a href="http://www.dosideas.com/motivacion.html"><span>Motivación</span></a></li><li class="item68"><a href="http://www.dosideas.com/reflexiones.html"><span>Reflexiones</span></a></li></ul>					</div>
				</div>
			</div>
		</div>
			<div class="module-style2-color3">
			<div>
				<div>
					<div>
													<h3 style="visibility: visible;"><span>Más</span> tecnología</h3>
											<ul class="menu"><li class="item62"><a href="http://www.dosideas.com/actualidad.html"><span>Actualidad</span></a></li><li class="item63"><a href="http://www.dosideas.com/base-de-datos.html"><span>Base de datos</span></a></li><li class="item64"><a href="http://www.dosideas.com/hardware.html"><span>Hardware</span></a></li><li id="current" class="active item61"><a href="http://www.dosideas.com/java.html"><span>Java</span></a></li><li class="item60"><a href="http://www.dosideas.com/entretenimientos.html"><span>Entretenimientos</span></a></li></ul>					</div>
				</div>
			</div>
		</div>
			<div class="module-style2-color3">
			<div>
				<div>
					<div>
													<h3 style="visibility: visible;"><span>El</span> albañil</h3>
											<img style="margin: 5px; float: left;" alt="ladrillos" src="214-les-presentamos-spring-batch_files/ladrillos.png" width="80" height="59">Anécdotas tragi-cómicas en Sistemas (y casi reales) <a href="http://www.dosideas.com/el-albanil.html" class="readon2">¡Leer más!</a>					</div>
				</div>
			</div>
		</div>
			<div class="module">
			<div>
				<div>
					<div>
													<h3 style="visibility: visible;"><span>Últimos</span> comentarios</h3>
											<script type="text/javascript">
function JOSC_viewPost59(contentid, id, itemid)
{
	window.location = 'index.php?option=com_content&task=view&id=' + contentid + (itemid ? ('&Itemid='+itemid) : '') + '&comment_id=' + id + '#josc' + id;
	if (navigator.userAgent.toLowerCase().indexOf("opera") != -1) window.location = '##';
}
</script>
	<div class="mod_comments"> <!-- style="overflow: hidden; width: 100%"> -->
		
<ul class="mod_comments">
<li class="mod_comments"><a class="mod_comments" href="http://www.dosideas.com/java/270.html?joscclean=1&amp;comment_id=267#josc267"><span class="small">leito<br></span>Hay dos algunas herramientas&nbsp;col...</a></li><li class="mod_comments"><a class="mod_comments" href="http://www.dosideas.com/java/242.html?joscclean=1&amp;comment_id=266#josc266"><span class="small">Emystein<br></span>Existe una extensión de EasyMock par...</a></li><li class="mod_comments"><a class="mod_comments" href="http://www.dosideas.com/java/136.html?joscclean=1&amp;comment_id=265#josc265"><span class="small">leito<br></span>El sitio parece estar caido ahora, pe...</a></li><li class="mod_comments"><a class="mod_comments" href="http://www.dosideas.com/java/219.html?joscclean=1&amp;comment_id=264#josc264"><span class="small">ivan mendoza<br></span>no seas mamón!!!1</a></li><li class="mod_comments"><a class="mod_comments" href="http://www.dosideas.com/java/136.html?joscclean=1&amp;comment_id=262#josc262"><span class="small">Klo<br></span>Me parece muy bueno el articulo sin e...</a></li><li class="mod_comments"><a class="mod_comments" href="http://www.dosideas.com/java/247.html?joscclean=1&amp;comment_id=257#josc257"><span class="small">cbalvarez<br></span>Me encanta la respuesta de Stroustrup...</a></li></ul> 
	</div>


					</div>
				</div>
			</div>
		</div>
			<div class="module">
			<div>
				<div>
					<div>
													<h3 style="visibility: visible;"><span>Destacados</span> del mes</h3>
											<ul class="mostread">
	<li class="mostread">
		<a href="http://www.dosideas.com/actualidad/247-10-preguntas-a-los-mas-grandes-programadores.html" class="mostread">
			10 preguntas a los más grandes programadores</a>
	</li>
	<li class="mostread">
		<a href="http://www.dosideas.com/java/242-mockito-o-basta-de-easymock.html" class="mostread">
			Mockito (o basta de EasyMock)</a>
	</li>
	<li class="mostread">
		<a href="http://www.dosideas.com/java/239-iajaxificando-un-formulario.html" class="mostread">
			¡Ajaxificando un formulario!</a>
	</li>
	<li class="mostread">
		<a href="http://www.dosideas.com/entretenimientos/233-retro-monkey-island.html" class="mostread">
			Retro: Monkey Island</a>
	</li>
	<li class="mostread">
		<a href="http://www.dosideas.com/liderazgo/248-en-el-futuro-isere-un-buen-lider.html" class="mostread">
			En el futuro, ¿seré un buen Líder?</a>
	</li>
</ul>					</div>
				</div>
			</div>
		</div>
								</div>
						</div>
										<!-- end sidecolumn -->
					<div class="clr"></div>
				</div>
			</div>
			<!-- end mainbody -->
			<!-- begin bottom section -->
						<div id="mainbody-bottom">
				<div id="mainbody-bottom2">
					<div id="mainbody-bottom3">
					</div>
				</div>
			</div>
			<!-- end bottom section -->
							<div align="center">
				<div id="footer">
							<div class="moduletable">
					<div> 2008, Dos Ideas. Contenido publicado bajo <a href="http://creativecommons.org/licenses/by-sa/2.5/ar/">Creative Commons</a>.<br></div>
<div></div>		</div>
	
				</div>
				</div>
					</div>
		<!-- end wrapper -->

<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script><script src="214-les-presentamos-spring-batch_files/ga.js" type="text/javascript"></script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-4281328-1");
pageTracker._initData();
pageTracker._trackPageview();
</script>

	<div id="rbCenter"></div><div id="rbLinks"><div id="rbPrevLink"><img style="width: 100%; height: 100%;" src="214-les-presentamos-spring-batch_files/blank_002.png"></div><div id="rbNextLink"><img style="width: 100%; height: 100%;" src="214-les-presentamos-spring-batch_files/blank_002.png"></div></div><div id="rbBottom"><div id="rbCloseLink"></div><div id="rbCaption"></div><div id="rbNumber"></div><div style="clear: both;"></div></div><div style="display: none;" id="rbShadow"><table style="width: 100%; height: 100%; border-collapse: collapse;" border="0" cellpadding="0" cellspacing="0"><tr style="height: 25px;"><td style="margin: 0px; padding: 0px; background: transparent url() repeat scroll center center; width: 27px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><img src="214-les-presentamos-spring-batch_files/zoom-shadow1.png" style="display: block;" width="27" height="25"></td><td style="margin: 0px; padding: 0px; background: transparent url(/templates/rt_hivemind_j15/rokzoom/images/zoom-shadow2.png) repeat scroll center center; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><img src="214-les-presentamos-spring-batch_files/blank_002.png" style="display: block;" width="1" height="1"></td><td style="margin: 0px; padding: 0px; background: transparent url() repeat scroll center center; width: 27px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><img src="214-les-presentamos-spring-batch_files/zoom-shadow3.png" style="display: block;" width="27" height="25"></td></tr><tr><td style="margin: 0px; padding: 0px; background: transparent url(/templates/rt_hivemind_j15/rokzoom/images/zoom-shadow4.png) repeat scroll center center; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><img src="214-les-presentamos-spring-batch_files/blank_002.png" style="display: block;" width="1" height="1"></td><td style="margin: 0px; padding: 0px; background: rgb(255, 255, 255) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" bgcolor="#ffffff" width="100%" height="100%"><img src="214-les-presentamos-spring-batch_files/blank_002.png" style="display: block;" width="1" height="1"></td><td style="margin: 0px; padding: 0px; background: transparent url(/templates/rt_hivemind_j15/rokzoom/images/zoom-shadow5.png) repeat scroll center center; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><img src="214-les-presentamos-spring-batch_files/blank_002.png" style="display: block;" width="1" height="1"></td></tr><tr style="height: 26px;"><td style="margin: 0px; padding: 0px; background: transparent url() repeat scroll center center; width: 26px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><img src="214-les-presentamos-spring-batch_files/zoom-shadow6.png" style="display: block;" width="27" height="26"></td><td style="margin: 0px; padding: 0px; background: transparent url(/templates/rt_hivemind_j15/rokzoom/images/zoom-shadow7.png) repeat scroll center center; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><img src="214-les-presentamos-spring-batch_files/blank_002.png" style="display: block;" width="1" height="1"></td><td style="margin: 0px; padding: 0px; background: transparent url() repeat scroll center center; width: 26px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><img src="214-les-presentamos-spring-batch_files/zoom-shadow8.png" style="display: block;" width="27" height="26"></td></tr></table></div></body></html>